
/**
 * SQLite3数据库初始化模块
 * model\sqlite\init.js
 * 1. npm install sqlite3
 * 2. API文档:https://github.com/TryGhost/node-sqlite3/wiki/API
 */

//导入Node.js文件模块
const fs = require("fs");
//导入SQLite3模块
const sqlite3 = require("sqlite3").verbose();
//导入工具模块
const util = require("../../common/util");
//导入配置模块
const config = require("../../common/config");

// 创建购物车表SQL
const sqlCreateCart = `
        CREATE TABLE IF NOT EXISTS cart(
        user_id CHAR(11) NOT NULL,  -- 学号，11位字符
        product_id INTEGER NOT NULL,   -- 商品ID
        add_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,  -- 添加时间，默认为当前时间
        lastupdate_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,  -- 最近修改时间，默认为当前时间
        quantity INTEGER NOT NULL CHECK(quantity > 0),  -- 数量，必须大于0
        unit_price DECIMAL(10, 2) NOT NULL CHECK(unit_price >= 0),  -- 单价，非负
        money DECIMAL(10, 2) NOT NULL CHECK(unit_price >= 0),  -- 总价，非负
        PRIMARY KEY (user_id, product_id)  -- 联合主键
    );
`;

// 创建订单表SQL
const sqlCreateOrder = `CREATE TABLE orders (
    order_id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 订单id自增主键写法
    order_number CHAR(20) NOT NULL,                 -- 订单号 20位字符
    buyer_id CHAR(11) NOT NULL,                     -- 学号，11位字符
    seller_id CHAR(11) NOT NULL,                    -- 卖家学号，11位字符
    item_id INTEGER NOT NULL,                   -- 商品ID
    quantity INTEGER NOT NULL DEFAULT 1,         -- 购买数量
    total_price DECIMAL(10, 2) CHECK(total_price >= 0),                 -- 总价 
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    order_status INTEGER NOT NULL DEFAULT 0,    -- 订单状态 0,1,2（已付款，待发货；已发货，待收货；已收货）

    UNIQUE (order_number)  -- SQLite 的 UNIQUE 约束写法
);`;

// 创建用户表SQL
const sqlCreateUsers = `
    CREATE TABLE IF NOT EXISTS users (
        user_id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 用户ID，自增主键
        username VARCHAR(50) NOT NULL UNIQUE,      -- 用户名，唯一
        nickname CHAR(255),           -- 昵称      
        password CHAR(255) NOT NULL,           -- 密码盐值(SHA-256)
        student_id CHAR(11) UNIQUE,               -- 学号
        real_name VARCHAR(20),                    -- 真实姓名
        email VARCHAR(100),                -- 邮箱，唯一
        phone CHAR(11),                           -- 手机号
        avatar_url TEXT,                          -- 头像URL
        role TINYINT NOT NULL DEFAULT 1,          -- 角色(1普通用户 2管理员)
        status TINYINT NOT NULL DEFAULT 1,        -- 状态(1正常 0禁用)
        last_login_time DATETIME,
        last_login_ip VARCHAR(255),
        login_count INTEGER DEFAULT 0,
        created_ip VARCHAR(255),
        created_at DATETIME,  -- 创建时间
        updated_at DATETIME,  -- 更新时间
        CHECK (role IN (1, 2)),                   -- 角色检查
        CHECK (status IN (0, 1))                  -- 状态检查
    );
`;

//SQL语句：创建User数据表中的第一个用户
const sqlCreateAdminUser = `
    INSERT INTO users(
        username,password,nickname,real_name,avatar_url,
        role,status,last_login_time,last_login_ip,login_count,
        created_ip,created_at,updated_at,student_id
    ) VALUES (
      'admin', '${util.md5Pwd("123456")}', '系统管理员', '超级管理员', 'https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png', 
      2, 1, 0, 'system init', 0,
      'system init', '${new Date().toISOString()}', '${new Date().toISOString()}','no_id'
    );
  `;

//创建商品表
  const sqlCreateGoods = `
    CREATE TABLE IF NOT EXISTS goods (
        goods_id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 商品ID，自增主键
        seller INTEGER NOT NULL, -- 卖家ID
        goods_name VARCHAR(50) NOT NULL,      -- 商品名，唯一
        browse_count INTEGER DEFAULT 0,      -- 浏览次数，默认为0
        goods_desc VARCHAR(255),              -- 商品描述
        goods_price DECIMAL(10, 2) NOT NULL CHECK(goods_price >= 0),  -- 商品价格，非负
        goods_stock INTEGER NOT NULL CHECK(goods_stock >= 0),  -- 商品库存，非负
        goods_detail TINYINT DEFAULT NULL,   -- 商品成色( 9~1成新 )
        goods_status TINYINT NOT NULL DEFAULT 1, -- 商品状态(1上架 0下架)
        created_at DATETIME,  -- 创建时间
        updated_at DATETIME,  -- 更新时间
        CHECK (goods_status IN (0, 1)),
        CHECK(goods_detail IN (9,8,7,6,5,4,3,2,1))
    );
    `;
 //SQL语句：创建User数据表
const sqlCreateReviews = `
    CREATE TABLE IF NOT EXISTS reviews(
        review_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        user_id INTEGER NOT NULL,
        goods_id INTEGER NOT NULL,
        content TEXT  NOT NULL,
        useful INTEGER DEFAULT 0,
        useless INTEGER DEFAULT 0,
        created_time DATETIME NOT NULL,
        priority TINYINT NOT NULL DEFAULT 0,
        CHECK (priority IN (0, 1))
    );`;

const sqlCreateGoodsImg = `
    CREATE TABLE IF NOT EXISTS imgs(
        img_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        goods_id INTEGER NOT NULL,
        img_url TEXT NOT NULL
    );`;

/**
 * SqliteDB构造函数
 * @constructor
 */
function SqliteDB() {
    this.dbFile = config.dbFile;
    //如果数据库market.db文件不存在则创建数据库文件
    if (!fs.existsSync(this.dbFile)) {
        util.log("创建SQLite数据库文件【market.db】");
        this.initDB();
    }
};

/**
 * 执行初始化数据库的SQL语句
 */
SqliteDB.prototype.initDB = function () {
    let db = new sqlite3.Database(this.dbFile, (err) => {
        if (err) {
            util.err(err);
        }
    });
    db.serialize(() => {
        db.run(sqlCreateOrder,(err)=>{
            err ? util.err(err) :util.log("数据表Order创建成功！");
            
        });
        
        db.run(sqlCreateCart,(err)=>{
            err ? util.err(err) :util.log("数据表Order创建成功！");
        });
        
        db.run(sqlCreateUsers, (err) => {
            if (err) {
                util.err(err);
            }
        });
        util.log("数据表Users创建成功！");

        db.run(sqlCreateGoods, (err) => {
            if (err) {
                util.err(err);
            }
        });
        util.log("数据表Goods创建成功！");

        db.run(sqlCreateReviews, (err) => {
            if (err) {
                util.err(err);
            }
        });
        util.log("数据表Reviews创建成功！");

        db.run(sqlCreateAdminUser, (err) => {
            if (err) {
                util.err(err);
            }
        });
        util.log("管理员添加成功！");

        db.run(sqlCreateGoodsImg, (err) => {
            if (err) {
                util.err(err);
            }
        });
        util.log("数据表GoodsImg创建成功！");
    })
    //SQLite数据库是基于文件，大量的资源消耗在文件的打开与关闭上会降低效率
    //   db.close((err) => {
    //     if (err) {
    //       util.err(err);
    //     }
    //   });
};

module.exports = SqliteDB